<?php
/*******************************************************************************
 * PHP mysql函数及其Mysqli函数代替用法
 * http://w3yyb.sinaapp.com/archives/782
 *******************************************************************************/
class DB{
	private $mysqli;

	function DB($dbhost, $dbuser, $dbpsw, $dbname = '', $charset = 'utf8'){
		$this->__construct($dbhost, $dbuser, $dbpsw, $dbname = '', $charset = 'utf8');
	}
	function __construct($dbhost, $dbuser, $dbpsw, $dbname = '', $charset = 'utf8'){
		$this->mysqli = new mysqli($dbhost, $dbuser, $dbpsw, $dbname);
		if(mysqli_connect_errno()){
			printf("Connect failed: %s\n", mysqli_connect_error());
			exit();
		}
		// printf("Host information: %s\n", $this->mysqli->host_info);exit();		
		$this->mysqli->set_charset($charset);
	}
	
	public function select_db($dbname = ''){
		$dbname = $dbname ? $dbname : $this->dbname;
		return $this->mysqli->query("SELECT DATABASE {$dbname}");
	}
	
	/**
	 * 从结果集中取一个字段
	 *
	 * @param resource $result 结果集
	 * @return string
	 */
	public function result($result, $col = 0){
		$row = $result->fetch_row();
		return $row[$col];
	}
	
	/**
	 * 执行 SQL 查询
	 *
	 * @param string $sql SQL 语句
	 * @return mixed 资源标识符
	 */
	public function query($sql) {
		if(defined('DEBUG_PR') && DEBUG_PR == true){
			$GLOBALS['debug_info']['SQLs'][] = $sql;
		}
		if(defined('DEBUG_FB') && DEBUG_FB == true){
			fb($sql, 'SQLS');
		}
		if(!$query = $this->mysqli->query($sql)) {
			$this->halt('MySQL Query Error', $sql);
		}
		return $query;
	}
	
	/**
	 * 计算记录集行数
	 *
	 * @param resource $result 结果集
	 * @return int
	 */
	public function num_rows($result){
		return $result->num_rows($result);
	}
	
	/**
	 * 查询数据表列数，即字段数
	 *
	 * @param resource $result 结果集
	 * @return int
	 */
	public function num_fields($result){
		return $result->num_fields($result);
	}
	
	/**
	 * 从结果集中取一行作为关联数组
	 *
	 * @param resource $result 结果集
	 * @return array MSSQL_ASSOC：关联数组，MSSQL_NUM：枚举数组，MSSQL_BOTH：两者
	 */
	public function fetch_array($result){
		return $result->fetch_array(MYSQL_ASSOC);
	}
	
	/**
	 * 从结果集中取一行作为枚举数组
	 *
	 * @param resource $result 结果集
	 * @return array
	 */
	public function fetch_row($result){
		return $result->fetch_row();
	}
	
	/**
	 * 释放结果集内存资源
	 *
	 * @param resource $result 结果集
	 * @return bool
	 */
	public function free_result($result){
		return $result->free_result();
	}
	
	/**
	 * 关闭数据库连接
	 *
	 * @return bool
	 */
	public function close() {
		return $this->mysqli->close();
	}
	
	/**
	 * 返回字符串
	 *
	 * @param string $msg
	 * @return string
	 */
	private function halt($message = '', $sql = ''){
		printf("Error No: %s\n", $this->mysqli->errno);
		printf("Error Info: %s\n", $this->mysqli->error);
		printf("SQL: %s\n", $sql);
		printf("Message: %s\n", $message);
		exit();
	}
	
	/**
	 * 取得上一步 INSERT 操作产生的 ID
	 *
	 * @return int
	 */
	public function insert_id() {
		return mysqli_insert_id($this->mysqli);
	}
	
	/**
	 * 返回前一次 MySQL 操作所影响的记录行数
	 * @return number
	 */
	public function affected_rows(){
		return mysqli_affected_rows($this->mysqli);
	}


	/**
	 * 加引号
	 * @param  mix $value 值
	 * @param  string $type
	 * @return mix
	 */
	public function quote($value, $type = ''){
		// 去除斜杠
		if(MAGIC_QUOTE){
			$value = stripslashes($value);
		}
		// 如果不是数字则加引号
		//if(!is_numeric($value)){
			$value = "'".$this->mysqli->real_escape_string($value)."'";
		//}
		return $value;
	}
}
?>
